#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>

// 定义两个信号量
sem_t sem_empty;
sem_t sem_full;

void* producterThd(void* arg) {

	for (int i = 0; i < 10; i++) {
		printf("Producter producing one item.\n");
		// 生产者线程创建产品后，需要等到仓库为空才能向仓库 put，否则需要等待
		// 即: sem_empty 信号量的值 > 0
		sem_wait(&sem_empty);
		
		printf("Producter putting item to warehouse.\n");
		// 生产者线程 put 商品后，需要将 sem_full 信号 +1 ，表示通知消费者线程仓库有商品
		sem_post(&sem_full);
	}

	pthread_exit(0);
}

void* consumerThd(void* arg) {

	for (int i = 0; i < 10; i++) {
		// 消费者线程需要仓库不为空才能 get 商品
		// 即 sem_full 信号量的值 > 0
		sem_wait(&sem_full);
		printf("Consumer getting item from warehouse.\n");
		
		// 消费者线程从仓库拿出商品后需要通知生产者线程创建商品
		// 即将 sem_empty 信号 +1
		sem_post(&sem_empty);
		
		printf("Consumer consuming the item\n");
	}

	pthread_exit(0);
}

int main() {

	// 初始化两个信号量
	// 默认仓库是空的，此时 producter 可以生产，consumer 需要等待
	sem_init(&sem_empty, 0, 1);
	sem_init(&sem_full, 0, 0);

	pthread_t producter_tid;
	pthread_t consumer_tid;
	
	pthread_create(&producter_tid, NULL, producterThd, NULL);
	pthread_create(&consumer_tid, NULL, consumerThd, NULL);
	
	pthread_join(producter_tid, NULL);
	pthread_join(consumer_tid, NULL);
	
	sem_destroy(&sem_empty);
	sem_destroy(&sem_full);

	return 0;
}
